//
// Created by PC on 2023/9/4.
//


#include <iostream>
#include <ctime>

using namespace std;
int add (int a,int b)
{
    int aa = a;
    while(b)
    {
        aa=a^b;
        b=(a&b)<<1;
        a=aa;
    }
    return aa;
}


// 这个方法计算会有错 有时候又没错
int multiply01(int a, int b)
{
    int ans=0;
    bool negative = false;
    if ((a>0&&b>0) || (a<0&&b<0))
        negative=false;
    else if (a<0||b<0)
        negative=true;
    // 计算绝对值
    a = a>0?a:add(~a,1);
    b = b>0?b:add(~b,1);
    for (int t = 0; t <35; ++t)
    {
        int j = b&(1<<t);
        if(j)
        {
            ans=add(ans,a<<t);
        }
    }
    if (negative)
    {
        ans=add(~ans,1);
    }
    return ans;
}

int multiply02(int a, int b)
{
    int ans=0;
    bool negative = false;
    if ((a>0&&b>0) || (a<0&&b<0))
        negative=false;
    else if (a<0||b<0)
        negative=true;
    // 计算绝对值
    a = a>0?a:add(~a,1);
    b = b>0?b:add(~b,1);
    // 和multiply01区别在while循环, 直接对a左移和b右移即可, 不用计数了
    while(b)
    {
        if(b&1)
        {
            ans=add(ans,a);
        }
        b>>=1;
        a<<=1;
    }
    if (negative)
    {
        ans=add(~ans,1);
    }
    return ans;
}

int main()
{
    int x=16,y=6,t=1000;
    srand((int) time(0));
    x = rand();
    y = rand();
//    x = rand();
//    y = rand();
    printf("%d*%d=%d\n",x,y,x*y);
    cout<<multiply01(x,y)<<endl;
    cout<<multiply02(x,y)<<endl;
    return 0;
}